home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Mac Game Programming Gurus / TricksOfTheMacGameProgrammingGurus.iso / More Source / Libraries / SAT 2.3b4 / Demo ƒ / HeartQuest demo ƒ / sFlypaper.p < prev    next >
Text File  |  1995-01-22  |  4KB  |  156 lines

  1. {===============================================}
  2. {================= Flypaper sprite unit ================}
  3. {===============================================}
  4.  
  5. { Example file for Ingemars Sprite Animation Toolkit. }
  6. { © Ingemar Ragnemalm 1992 }
  7. { See doc files for legal terms for using this code. }
  8.  
  9. unit sFlypaper;
  10.  
  11. { Sprite unit. A sprite unit should include the following routines:}
  12. { Init-procedure, that initializes private bitmaps}
  13. { Setup-procedure, that sets variables other than the standard ones set by MakeSprite }
  14. { Handle-procedure, to be called once per iteration until the sprite dies }
  15. { Hittask-procedure (optional), for advanced collission handling. }
  16.  
  17. { Flypaper object, the "enemies" in the HeartQuest game. }
  18.  
  19. interface
  20.  
  21.     uses
  22. {$IFC UNDEFINED THINK_PASCAL}
  23.         Types, Quickdraw, 
  24. {$ENDC}
  25.         SAT, scores, SoundConst, GameGlobals;
  26.  
  27.     var
  28.         slowcount: integer;
  29.  
  30.     procedure InitFlypaper;
  31.     procedure SetupFlypaper (mp: SpritePtr);
  32.     procedure HandleFlypaper (me: SpritePtr);
  33.     procedure HandleDyingFlypaper (me: SpritePtr); {Behöver inte vara extern}
  34.  
  35. implementation
  36.  
  37.     var
  38.         FlypaperFace: array[1..6] of FacePtr;
  39.         DyingFlypaperFace: array[1..3] of FacePtr;
  40.  
  41.     procedure InitFlypaper;
  42.         var
  43.             ii: integer;
  44.             h: Handle;
  45.     begin
  46.         for ii := 1 to 6 do
  47.             FlypaperFace[ii] := SATGetFace(156 + ii);
  48.         for ii := 1 to 3 do
  49.             DyingFlypaperFace[ii] := SATGetFace(143 + ii);
  50.     end;
  51.  
  52.     procedure SetupFlypaper (mp: SpritePtr);
  53.     begin
  54.         mp^.face := FlypaperFace[1];
  55.         mp^.mode := SATRand(3) + 1; { icon number }
  56.         SetRect(mp^.hotRect, -14 + 16, -28 + 32, 14 + 16, 0 + 32);
  57.         mp^.task := @HandleFlypaper;
  58.     end;
  59.  
  60.     procedure HandleFlypaper (me: SpritePtr);
  61.         var
  62.             mp: Spriteptr;
  63.             divmed: integer;
  64.     begin
  65.         if me^.kind <> -3 then
  66.             begin
  67.                 me^.kind := -3;
  68.                 if slowcount < 10 then
  69.                     begin
  70.                         slowcount := 50;
  71.                         SATSoundPlay(Splatt2SndH, 1, true);
  72.                         me^.task := @HandleDyingFlypaper;
  73.                         me^.kind := 0;
  74.                     end;
  75.             end;
  76.  
  77.         me^.mode := me^.mode + 1;
  78.         if me^.mode = 7 then
  79.             me^.mode := 1;
  80.         me^.face := FlypaperFace[me^.mode];
  81.  
  82.         me^.position.h := me^.position.h + me^.speed.h;
  83.         me^.position.v := me^.position.v + me^.speed.v;
  84.  
  85.         if SATRand100 < 7 then
  86.             me^.speed.h := SATRand(15) - 8;
  87.         if SATRand100 < 4 then
  88.             me^.speed.v := SATRand(7) - 4;
  89.  
  90.         if (level > 4) then
  91.             if SATRand100 < level then
  92.                 if slowcount = 0 then
  93.                     begin
  94.                         me^.speed.h := PlayerPos.h - me^.position.h;
  95.                         me^.speed.v := PlayerPos.v - me^.position.v;
  96.                         divmed := abs(me^.speed.h) + abs(me^.speed.v);
  97.                         if divmed > level then
  98.                             begin
  99.                                 me^.speed.h := me^.speed.h * 2 * level div divmed;
  100.                                 me^.speed.v := me^.speed.v * 2 * level div divmed;
  101.                             end;
  102.                     end
  103.                 else {Player stunned - keep away!}
  104.                     begin
  105.                         me^.speed.h := -(PlayerPos.h - me^.position.h);
  106.                         me^.speed.v := -(PlayerPos.v - me^.position.v);
  107.                         divmed := abs(me^.speed.h) + abs(me^.speed.v);
  108.                         if divmed > level then
  109.                             begin
  110.                                 me^.speed.h := me^.speed.h * 2 * level div divmed;
  111.                                 me^.speed.v := me^.speed.v * 2 * level div divmed;
  112.                             end;
  113.                     end;
  114.  
  115.         if me^.position.h < 0 then
  116.             begin
  117.                 me^.position.h := 0;
  118.                 me^.speed.h := 1;
  119.             end;
  120.         if me^.position.h > gSAT.offSizeH - xsize then
  121.             begin
  122.                 me^.position.h := gSAT.offSizeH - xsize;
  123.                 me^.speed.h := -1;
  124.             end;
  125.         if me^.position.v < 0 then
  126.             begin
  127.                 me^.position.v := 0;
  128.                 me^.speed.v := 1;
  129.             end;
  130.         if me^.position.v > gSAT.offSizeV - 32 then
  131.             begin
  132.                 me^.position.v := gSAT.offSizeV - 32;
  133.                 me^.speed.v := -1;
  134.             end;
  135.     end;
  136.  
  137.     procedure HandleDyingFlypaper (me: SpritePtr);
  138.         var
  139.             mp: Spriteptr;
  140.             divmed: integer;
  141.     begin
  142.         if me^.kind <> 0 then
  143.             me^.kind := 0;
  144.  
  145.         me^.mode := me^.mode + 1;
  146.         if me^.mode >= 4 then
  147.             me^.mode := 1;
  148.         me^.face := DyingFlypaperFace[me^.mode];
  149.  
  150.         me^.position.v := me^.position.v + 8;
  151.  
  152.         if me^.position.h > gSAT.offSizeH then
  153.             me^.task := nil;
  154.     end;
  155.  
  156. end.